package cn.lingyangwl.agile.msg.push.api.model.content;

import cn.lingyangwl.agile.model.constants.*;
import cn.lingyangwl.agile.msg.push.api.constatnts.*;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotEmpty;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author shenguangyang
 */
@Data
@Accessors(chain = true)
public class MsgParam {

    protected String title;

    /**
     * 页面地址, 邮箱、短信等渠道用不到
     *
     * 如果没有指定则会使用控制台的消息推送中配置的地址
     */
    private String pageUrl;

    /**
     * url参数
     */
    private final Map<String, String> urlParams = new HashMap<>();

    /**
     * 渠道类型
     */
    @NotEmpty(message = ValidationCons.NOT_EMPTY)
    private String channelType;

    /**
     * 消息通知编码
     * MsgNotice.code
     */
    @NotEmpty(message = ValidationCons.NOT_EMPTY)
    protected String code;

    /**
     * 自定义关联的业务主键
     */
    private String bizKey;

    /**
     * 自定义关联业务类型
     */
    private String bizType;

    /**
     * 接收用户的登录id, 目前只有推送站内信的时候才会用到, 其他不会用到
     */
    private String loginId = "*";

    /**
     * 接受者用户编码，可直接指定接受者手机号或邮箱地址等
     */
    private String toUser;

    /**
     * 计划推送时间（指定推送时间，延迟推送）
     */
    private LocalDateTime planPushDate;

    /**
     * 模板配置
     */
    protected List<MsgField> msgFieldList = new ArrayList<>();

    public MsgParam addAllMsgField(List<MsgField> list) {
        this.msgFieldList.addAll(list);
        return this;
    }

    public MsgParam addMsgField(String key, Object value) {
        this.msgFieldList.add(new MsgField(key, value, null));
        return this;
    }

    public MsgParam addMsgField(MsgFieldEnum fieldEnum, Object value) {
        this.msgFieldList.add(new MsgField(fieldEnum.getKey(), value, null));
        return this;
    }

    public MsgParam addAllMsgField(JSONObject data) {
        data.forEach((k, v) -> this.msgFieldList.add(new MsgField(k, v, "")));
        return this;
    }

    public MsgParam addMsgField(String key, Object value, String color) {
        this.msgFieldList.add(new MsgField(key, value, color));
        return this;
    }

    /**
     * 在多久之后推送通知
     */
    public void pushAfter(Duration duration) {
        this.planPushDate = LocalDateTime.now().plusSeconds(duration.getSeconds());
    }

    public MsgParam jsonToObj(String jsonStr) {
        return JSON.parseObject(jsonStr, MsgParam.class);
    }

    public MsgParam addUrlParam(String key, String value) {
        this.urlParams.put(key, value);
        return this;
    }
}
